package cn.haut.online_read.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Random;

/**
 * @author xing
 * @date 2021-05-19 20:09
 */
@Component
public class TokenUtils {

    @Resource
    private RedisUtils redisUtils;

    /**
     * 创建 Token
     *
     * @param username
     * @return
     */
    public String makeToken(String username){
        String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + username;
        //数据指纹   128位长   16个字节  md5
        try {
            MessageDigest md = MessageDigest.getInstance("md5");
            //对于给定数量的更新数据，digest 方法只能被调用一次。digest 方法被调用后，MessageDigest对象被重新设置成其初始状态。
            byte md5[] =  md.digest(token.getBytes());
            //base64编码--任意二进制编码明文字符   adfsdfsdfsf
            Base64.Encoder encoder = Base64.getEncoder();
            String tokenEncode = encoder.encodeToString(md5);
            setRedis(username, tokenEncode);
            return tokenEncode;
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 验证token
     *
     * @param username
     * @param tokenRequest
     * @return 验证是否通过
     */
    public boolean validateToken(String username, String tokenRequest) {
        // 从Redis获取token, 查看是否一样
        // 获取Redis里的值
        String token = redisUtils.getValue(username);
        // 不为空且相等
        if(token != null && token.equals(tokenRequest)) {
            // 返回true
            return true;
        }
        return false;
    }

    /**
     * 删除用户的 token
     *
     * @param username
     * @return
     */
    public Boolean removeToken(String username) {
        return redisUtils.deleteValue(username);
    }

    /**
     * token存入redis, 在上边创建 token 方法里使用。
     *
     * @param username
     * @param tokenEncode
     */
    private void setRedis(String username, String tokenEncode) {
        // 存入Redis
        // 有效时间设为 1 小时
//        redisUtils.setex(username, tokenEncode, 60 * 60);
        redisUtils.set(username, tokenEncode);
    }

}
